from typing import NamedTuple, Dict


class Message:
    """ Класс, связанный с отображением сообщений для пользователя """

    def show_welcome_message(self, link_to_video: str) -> None:
        message = f'\n##### DOWNLOAD VIDEO OR AUDIO #####\n\n'
        message += self.make_text_underline(
            f'      About the video\n\n'
        )
        message += f'[*] Link: {link_to_video}'
        print(message)


    def make_text_underline(self, text: str) -> str:
        """ Делаем текст подчеркнутым """

        text += '\u0332'
        text_underline = ['\u0332' + symbol if count != 0 else symbol
                          for count, symbol in enumerate(text, 0)]
        return ''.join(text_underline)


class MessageTerminal(Message):
    """ Сообщения относящиеся конкретно к терминалу """

    def show_list_of_available_arguments(self) -> None:
        """ Показываем список доступных аргументов """

        # Избегаем циклического импорта
        from input_data import InputDataFromUserFromTerminal

        message = '\n##### AVAILABLE ARGUMENTS TO USE #####\n\n'
        list_of_created_arguments = InputDataFromUserFromTerminal() \
                .get_list_of_created_arguments()

        for argument in list_of_created_arguments:
            value = self.make_text_underline(argument.value)
            message += f'[*] {argument.keys} \u2014 {value}\n'

        print(message)


    def show_video_download_options(self, list_of_possible_streams: NamedTuple) -> None:
        """ Показываем варианты загрузки видео """

        message = ''
        message += self.make_text_underline(
            f'      Choose quality\n\n'
        )

        for key in list_of_possible_streams:
            message += f'[*] {key} - {list_of_possible_streams[key].options}\n'

        print(message)


    def show_basic_information_of_video(self,
                                        basic_information_of_video: Dict) -> None:
        """ Показываем основную информацию о видео """

        message = ''
        message += f'[*] Date of publication: {basic_information_of_video["publish_date"]}\n'
        message += f'[*] Views: {basic_information_of_video["views"]}\n'
        message += f'[*] Author: {basic_information_of_video["author"]}\n'
        message += f'[*] Title: {basic_information_of_video["title"]}\n'
        message += f'[*] Duration: {basic_information_of_video["length"]}\n'
        message += f'[*] Description: {basic_information_of_video["description"]}\n'
        message += f'[*] Keywords: {basic_information_of_video["keywords"]}\n'

        print(message)


    def show_possible_actions(self) -> None:
        """ Показываем возможные действия """

        message = self.make_text_underline(
            f'      Choose what to do next\n\n'
        )
        message += f'[>] Select a number to download the desired video format\n'
        message += '[>] Enter ' + self.make_text_underline('quit') + ' to exit\n'

        print(message)


    def report_invalid_response(self) -> None:
        """ Сообщаем пользователю о том, что был выбран недопустимый ответ """

        message = '\n[!] An invalid response option was selected!\n'
        print(message)


    def show_message_about_downloading_content(self, content_type: str) -> None:
        """ Показываем сообщение о загрузке какого-то контента """

        if content_type == 'video':
            message = '\n[*] Video downloaded successfully!\n'
        elif content_type == 'audio':
            message = '\n[*] Audio downloaded successfully!\n'
        else:
            raise ValueError(f'Переданный аргумент не обрабатывается: {content_type}')

        print(message)
